#ifndef MAPA_H_
#define MAPA_H_
#include "server_Casillero.h"
#include "server_Coordenada.h"
#include "server_IMovible.h"
#include "server_IOcupante.h"
#include "server_MaterialFisico.h"
#include <vector>
#include <list>
#include "server_Explosion.h"

using std::list;

class Mapa {
private:
    int tamanio;
    std::vector< std::vector<Casillero*> > cuadricula;
    list<Explosion*> explosiones;

public:
    /* Constructor. */
    Mapa();
    Mapa(int tam);
    /* Destructor. */
    ~Mapa();
    int getTamanio();
    void inicializar();
    bool fueraDeRango(Coordenada nuevaCoord);
    bool posicionBloqueada(Coordenada nuevaCoord);
    /* le asigna una nueva coordenada al movible segun la coordenada
     * recibida desde el cliente. Verifica colisiones y dependiendo de
     * estas mueve o no el movible. */
    bool moverElemento(IMovible* movible);
    bool hayColision(Coordenada coord);
    void resolverColisiones(IMovible* movible);
    /* Ubica el elemento en el casillero correspondiente a la coordenada.*/
    void ubicarElemento(IOcupante* elemento, Coordenada coord);
    /* Saca el elemento del casillero correspondiente a la coordenada.*/
    void sacarElemento(IOcupante* elemento, Coordenada coord);
    IOcupante* obtenerOcupante(Coordenada coord);
    MaterialFisico* obtenerMaterial(Coordenada coord);
    void establecerMaterial(MaterialFisico* material, Coordenada coordenada);
    string generarTileMap();
    void agregarExplosion(Coordenada coordExplosion);
    void limpiarExplosiones();
};

#endif
